/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Negocio;

import BaseDatos.GestorBD;
import Util.GestorErrores;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Vector;
import Util.Varios;

/**
 *
 * @author Javi
 */
public class Bien implements ObjetoDatos{
    //Nombre de la tabla de la Base de Datos
    private String _sNombreTabla = "bienes";
    //Descripción de la tabla de la Base de Datos
    private String _sDescripTabla = "Bienes";

    //Atributos de la tabla Bien
    private int _iIdBien;
    private String _sTipo;
    private String _sSubTipo;
    private int _iImporte;
    private String _sCodZona;
    private String _sCodCilindrada;
    private String _sCodUso;

    /*
     * Recupera todo el contenido de la tabla y lo devuelvo en 2 vectores. Uno con los nombres de los campos y
     * otro vector de vectores con los datos propiamente dichos (cada tupla de datos en un vector). El orden de los
     * campos de la fila es el mismo que el de los nombres de los campos.
     */
    public boolean selectAll ( Vector columnIdentifiers, Vector dataVector){
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM " + this._sNombreTabla + " ORDER BY IdCliente, Tipo, SubTipo");
            ResultSetMetaData metaDatos = rs.getMetaData();
            // Se obtiene el número de columnas.
            int numeroColumnas = metaDatos.getColumnCount();
            // Se obtiene cada una de las etiquetas para cada columna
            for (int i = 0; i < numeroColumnas; i++){
               // Nuevamente, para ResultSetMetaData la primera columna es la 1.
               columnIdentifiers.addElement( metaDatos.getColumnLabel(i + 1) );
            }

            while (rs.next()) {
                // Se crea un vector que será cada fila de la tabla.
                Vector fila = new Vector (numeroColumnas);

                // Se rellena cada posición del vector con una de las columnas de la tabla en base de datos.
                for (int i = 0; i < numeroColumnas; i++)
                    fila.addElement ( rs.getObject(i+1) ); // El primer indice en rs es el 1, no el cero, por eso se suma 1.

                // Se añade al modelo la fila completa.
                dataVector.addElement( fila );
            }
            rs.close();
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Inserta un registro en la tabla
     */
    public boolean insert ( ){
        if ( !validar () )
            return false;
        String sSQL = "INSERT INTO " + this._sNombreTabla + " (Tipo, SubTipo, Importe, CodZona, CodCilindrada, CodUso) " +
            "VALUES (" +
            "'" + this._sTipo + "', '" + this._sSubTipo + "', " +
            this._iImporte + ", '" + this._sCodZona + "', '" + this._sCodCilindrada +
            "', '" + this._sCodUso + "')";
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();
            //Recuperar y cargar en la clase el valor de la clave AUTONUMERICA generada por el motor de BD
            this._iIdBien = GestorBD.obtenerLastAutonumerico();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Actualiza un registro en la entidad 
     */
    public boolean update ( ){
        if ( !validar () )
            return false;
        String sSQL = "UPDATE " + this._sNombreTabla + " SET Tipo = '" + this._sTipo + "', " +
            " SubTipo = '" + this._sSubTipo + "', Importe = " + this._iImporte +
            ", CodZona = '" + this._sCodZona + "', CodCilindrada = '" + this._sCodCilindrada +
            "', CodUso = '" + this._sCodUso + "'" +
             " WHERE IdBien = " + this._iIdBien;
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Borra un registro de la Entidad 
     */
    public boolean delete (){
        String sSQL = "DELETE FROM " + this._sNombreTabla + 
             " WHERE IdBien = " + this._iIdBien;
        try {
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            st.execute(sSQL);
            st.close();
            return true;
        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /*
     * Valida los datos de la clase antes de hacer una inserción/actualización.
     * Se informa de los errores que se produzcan mediante un vector de String.
     */
    public boolean validar (){
        if ( this._sTipo.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El Tipo de bien es obligatorio");
        if ( this._sSubTipo.trim().equals("") )
            GestorErrores.getInstancia().getvErrores().add ("El Subtipo de bien es obligatorio");
        if ( this._sTipo.trim().equals("1") ){   //Inmuebles
            if (this._sCodZona.trim().equals(""))
                GestorErrores.getInstancia().getvErrores().add ("La zona es obligatoria");
        }else if ( this._sTipo.trim().equals("2") ){   //Vehículos
            if (this._sCodCilindrada.trim().equals(""))
                GestorErrores.getInstancia().getvErrores().add ("La cilindrada es obligatoria");
            if (this._sCodUso.trim().equals(""))
                GestorErrores.getInstancia().getvErrores().add ("El tipo de uso es obligatorio");
        }
        if ( this._iImporte == 0 )
            GestorErrores.getInstancia().getvErrores().add ("El importe del bien es obligatorio");
        return (GestorErrores.getInstancia().getvErrores().size () == 0);
    }

    /*
     * Carga SOLO los atributos que conforman la clave de la clase a partir de 2 vectores,
     * uno con los nombres de los campos
     * y otro con los valores de los mismos.
     */
    public void vectorJTableAClavesClase ( Vector columnIdentifiers, Vector dataRow ){
        inicializa();
        int iIndice = Varios.getPosCadena(columnIdentifiers, "IdBien");
        this._iIdBien = Integer.parseInt( dataRow.get(iIndice).toString() );
    }

    /*
     * Devuelve un vector cargado con los atributos de la clase para mostrar en el JTable del panel.
     * El orden de los atributos es el indicado
     * en el vector con los nombres de los campos.
     */
    public Vector claseAVectorJTable ( Vector columnIdentifiers ){
        Vector resul = new Vector ();
        for (int i=0; i < columnIdentifiers.size(); i++){
            if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("IdBien") == 0 )
                resul.add( this._iIdBien );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Tipo") == 0 )
                resul.add( this._sTipo );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("SubTipo") == 0 )
                resul.add( this._sSubTipo );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("Importe") == 0 )
                resul.add( this._iImporte );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("CodZona") == 0 )
                resul.add( this._sCodZona );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("CodCilindrada") == 0 )
                resul.add( this._sCodCilindrada );
            else if ( ((String) columnIdentifiers.get(i)).compareToIgnoreCase("CodUso") == 0 )
                resul.add( this._sCodUso );
        }
        return resul;
    }

    /*
     * Este método recupera de la tabla un registro cuya clave primaria están cargados en los
     atributos de la clase correspondientes a la clave. Se recuperan los campos del registro y
     se carga el resto de los atributos de la clase.
     */
    public void recupera (){
        try {
            //Primero obtengo el registro del cliente que tenga una fecha mayor
            Statement st = GestorBD.getInstancia().getConexion().createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM " + this._sNombreTabla + " WHERE " +
            " IdBien = " + this._iIdBien );
            if ( rs.next() ) {
                this._iIdBien = rs.getInt("IdBien");
                this._sTipo= rs.getString("Tipo");
                this._sSubTipo = rs.getString("SubTipo");
                this._iImporte = rs.getInt("Importe");
                this._sCodZona = rs.getString("CodZona");
                this._sCodCilindrada = rs.getString("CodCilindrada");
                this._sCodUso = rs.getString("CodUso");
            }
            rs.close();
            st.close();

        }catch (SQLException e1){
            GestorErrores.getInstancia().getvErrores().add ( e1.getMessage() );
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public void inicializa (){
        this._iIdBien = 0;
        this._sTipo = "";
        this._sSubTipo ="";
        this._iImporte = 0;
        this._sCodZona = "";
        this._sCodCilindrada = "";
        this._sCodUso = "";
    }

    public String getsDescripTabla() {
        return _sDescripTabla;
    }

    public void setsDescripTabla(String _sDescripTabla) {
        this._sDescripTabla = _sDescripTabla;
    }

    public String getsNombreTabla() {
        return _sNombreTabla;
    }

    public void setsNombreTabla(String _sNombreTabla) {
        this._sNombreTabla = _sNombreTabla;
    }

    public int getiIdBien() {
        return _iIdBien;
    }

    public void setiIdBien(int _iIdBien) {
        this._iIdBien = _iIdBien;
    }

    public int getiImporte() {
        return _iImporte;
    }

    public void setiImporte(int _iImporte) {
        this._iImporte = _iImporte;
    }

    public String getsCodCilindrada() {
        return _sCodCilindrada;
    }

    public void setsCodCilindrada(String _sCodCilindrada) {
        this._sCodCilindrada = _sCodCilindrada;
    }

    public String getsCodUso() {
        return _sCodUso;
    }

    public void setsCodUso(String _sCodUso) {
        this._sCodUso = _sCodUso;
    }

    public String getsCodZona() {
        return _sCodZona;
    }

    public void setsCodZona(String _sCodZona) {
        this._sCodZona = _sCodZona;
    }

    public String getsSubTipo() {
        return _sSubTipo;
    }

    public void setsSubTipo(String _sSubTipo) {
        this._sSubTipo = _sSubTipo;
    }

    public String getsTipo() {
        return _sTipo;
    }

    public void setsTipo(String _sTipo) {
        this._sTipo = _sTipo;
    }

}
